package demo6;

import java.util.ArrayList;
import java.util.List;

/*
将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：

P   A   H   N
A P L S I I G
Y   I   R


输入：s = "PAYPALISHIRING", numRows = 4
输出："PINALSIGYAHRPI"
解释：
P     I    N
A   L S  I G
Y A   H R
P     I

 */
public class Test {
    public static void main(String[] args) {
        System.out.println(convert("PAYPALISHIRING",3));
    }

    public static String convert(String s, int numRows) {
        StringBuffer sb = new StringBuffer();
        //需要多少层，就给多少个数组分别保存数据
        List<Character>[] list = new ArrayList[numRows];
        //初始化每个数组
        for (int i = 0; i < numRows; i++) {
            list[i] = new ArrayList<>();
        }
        /*
            规律：先将字符串垂直向下读取，顺序存进每个数组中，
            再去掉头尾逆向读取后续字符，以此为一循环
         */
        int index = 0;//下标，用来判断是否读完字符串的下标
        while (index != s.length()){
            //顺序读取
            for (int i = 0; i < numRows && index != s.length(); i++,index++) {
                list[i].add(s.charAt(index));
            }
            //逆向读取
            for (int i = numRows-2 ; i > 0 && index != s.length(); i--,index++) {
                list[i].add(s.charAt(index));
            }
        }
        //将每个数组的值放入StringBuffer中
        for (int i = 0; i < list.length; i++) {
            for (int j = 0; j < list[i].size(); j++) {
                sb.append(list[i].get(j));
            }
        }
        return sb.toString();
    }
}
